@itwin/rpcinterface-full-stack-tests 3.6.0-dev.3 → 3.6.0-dev.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -103171,13 +103171,13 @@ class EnvironmentDecorations {
103171
103171
  this._onLoaded = onLoaded;
103172
103172
  this._onDispose = onDispose;
103173
103173
  this._sky = {};
103174
- this.loadSky();
103174
+ this.loadSkyBox();
103175
103175
  if (this._environment.displayGround)
103176
103176
  this.loadGround();
103177
103177
  }
103178
103178
  dispose() {
103179
103179
  this._ground = undefined;
103180
- this._sky.promise = this._sky.params = undefined;
103180
+ this._sky.params = this._sky.promise = undefined;
103181
103181
  this._onDispose();
103182
103182
  }
103183
103183
  setEnvironment(env) {
@@ -103192,7 +103192,7 @@ class EnvironmentDecorations {
103192
103192
  this.loadGround();
103193
103193
  // Update sky box
103194
103194
  if (env.sky !== prev.sky)
103195
- this.loadSky();
103195
+ this.loadSkyBox();
103196
103196
  }
103197
103197
  decorate(context) {
103198
103198
  const env = this._environment;
@@ -103261,82 +103261,99 @@ class EnvironmentDecorations {
103261
103261
  params.material = material;
103262
103262
  return params;
103263
103263
  }
103264
- loadSky() {
103265
- const promise = this.loadSkyParams();
103264
+ loadSkyBox() {
103265
+ const loader = this.loadSkyBoxParams();
103266
+ if (undefined === loader.preload) {
103267
+ this.setSky(loader.load());
103268
+ return;
103269
+ }
103270
+ const promise = loader.preload;
103266
103271
  this._sky.promise = promise;
103267
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
103268
- promise.then((params) => {
103272
+ loader.preload.then((loaded) => {
103269
103273
  if (promise === this._sky.promise)
103270
- this.setSky(params !== null && params !== void 0 ? params : this.createSkyGradientParams());
103271
- });
103272
- promise.catch(() => {
103273
- if (this._sky.promise === promise)
103274
- this.setSky(this.createSkyGradientParams());
103274
+ this.setSky(loaded ? loader.load() : undefined);
103275
+ }).catch(() => {
103276
+ if (promise === this._sky.promise)
103277
+ this.setSky(undefined);
103275
103278
  });
103276
103279
  }
103277
103280
  setSky(params) {
103278
103281
  this._sky.promise = undefined;
103279
- this._sky.params = params;
103282
+ this._sky.params = params !== null && params !== void 0 ? params : this.createSkyGradientParams();
103280
103283
  this._onLoaded();
103281
103284
  }
103282
- async loadSkyParams() {
103285
+ loadSkyBoxParams() {
103286
+ let load;
103287
+ let preload;
103283
103288
  const sky = this._environment.sky;
103284
103289
  if (sky instanceof _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.SkyCube) {
103285
103290
  const key = this.createCubeImageKey(sky);
103286
- const existingTexture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(key, this._view.iModel);
103287
- if (existingTexture)
103288
- return { type: "cube", texture: existingTexture };
103289
- // Some faces may use the same image. Only request each image once.
103290
- const specs = new Set([sky.images.front, sky.images.back, sky.images.left, sky.images.right, sky.images.top, sky.images.bottom]);
103291
- const promises = [];
103292
- for (const spec of specs)
103293
- promises.push(this.imageFromSpec(spec));
103294
- return Promise.all(promises).then((images) => {
103295
- const idToImage = new Map();
103296
- let index = 0;
103297
- for (const spec of specs) {
103298
- const image = images[index++];
103299
- if (!image)
103300
- return undefined;
103301
- else
103302
- idToImage.set(spec, image);
103303
- }
103304
- // eslint-disable-next-line deprecation/deprecation
103305
- const params = new _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.RenderTexture.Params(key, _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.RenderTexture.Type.SkyBox);
103306
- const txImgs = [
103307
- idToImage.get(sky.images.front), idToImage.get(sky.images.back), idToImage.get(sky.images.top),
103308
- idToImage.get(sky.images.bottom), idToImage.get(sky.images.right), idToImage.get(sky.images.left),
103309
- ];
103310
- const texture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.createTextureFromCubeImages(txImgs[0], txImgs[1], txImgs[2], txImgs[3], txImgs[4], txImgs[5], this._view.iModel, params);
103291
+ load = () => {
103292
+ const texture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(key, this._view.iModel);
103311
103293
  return texture ? { type: "cube", texture } : undefined;
103312
- });
103294
+ };
103295
+ if (!_IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(key, this._view.iModel)) {
103296
+ // Some faces may use the same image. Only request each image once.
103297
+ const promises = [];
103298
+ const specs = new Set([sky.images.front, sky.images.back, sky.images.left, sky.images.right, sky.images.top, sky.images.bottom]);
103299
+ for (const spec of specs)
103300
+ promises.push(this.imageFromSpec(spec));
103301
+ preload = Promise.all(promises).then((images) => {
103302
+ const idToImage = new Map();
103303
+ let index = 0;
103304
+ for (const spec of specs) {
103305
+ const image = images[index++];
103306
+ if (!image)
103307
+ return false;
103308
+ else
103309
+ idToImage.set(spec, image);
103310
+ }
103311
+ // eslint-disable-next-line deprecation/deprecation
103312
+ const params = new _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.RenderTexture.Params(key, _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.RenderTexture.Type.SkyBox);
103313
+ const txImgs = [
103314
+ idToImage.get(sky.images.front), idToImage.get(sky.images.back), idToImage.get(sky.images.top),
103315
+ idToImage.get(sky.images.bottom), idToImage.get(sky.images.right), idToImage.get(sky.images.left),
103316
+ ];
103317
+ return undefined !== _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.createTextureFromCubeImages(txImgs[0], txImgs[1], txImgs[2], txImgs[3], txImgs[4], txImgs[5], this._view.iModel, params);
103318
+ });
103319
+ }
103313
103320
  }
103314
103321
  else if (sky instanceof _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.SkySphere) {
103315
- const rotation = 0; // ###TODO where is this supposed to come from?
103316
- let texture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(sky.image, this._view.iModel);
103317
- if (!texture) {
103318
- const image = await this.imageFromSpec(sky.image);
103319
- if (image) {
103320
- texture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.createTexture({
103322
+ load = () => {
103323
+ const texture = _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(sky.image, this._view.iModel);
103324
+ return texture ? {
103325
+ type: "sphere",
103326
+ texture,
103327
+ rotation: 0,
103328
+ zOffset: this._view.iModel.globalOrigin.z,
103329
+ } : undefined;
103330
+ };
103331
+ if (!_IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.findTexture(sky.image, this._view.iModel)) {
103332
+ preload = this.imageFromSpec(sky.image).then((image) => {
103333
+ if (!image)
103334
+ return false;
103335
+ return undefined !== _IModelApp__WEBPACK_IMPORTED_MODULE_3__.IModelApp.renderSystem.createTexture({
103321
103336
  image: { source: image },
103322
103337
  ownership: { iModel: this._view.iModel, key: sky.image },
103323
103338
  });
103324
- }
103339
+ });
103325
103340
  }
103326
- if (!texture)
103327
- return undefined;
103328
- return { type: "sphere", texture, rotation, zOffset: this._view.iModel.globalOrigin.z };
103329
103341
  }
103330
103342
  else {
103331
- return this.createSkyGradientParams();
103343
+ load = () => this.createSkyGradientParams();
103332
103344
  }
103345
+ return { load, preload };
103333
103346
  }
103334
103347
  createCubeImageKey(sky) {
103335
103348
  const i = sky.images;
103336
103349
  return `skycube:${i.front}:${i.back}:${i.left}:${i.right}:${i.top}:${i.bottom}`;
103337
103350
  }
103338
103351
  createSkyGradientParams() {
103339
- return { type: "gradient", gradient: this._environment.sky.gradient, zOffset: this._view.iModel.globalOrigin.z };
103352
+ return {
103353
+ type: "gradient",
103354
+ gradient: this._environment.sky.gradient,
103355
+ zOffset: this._view.iModel.globalOrigin.z,
103356
+ };
103340
103357
  }
103341
103358
  async imageFromSpec(spec) {
103342
103359
  var _a;
@@ -118327,17 +118344,20 @@ class Viewport {
118327
118344
  if (undefined === view)
118328
118345
  return _ViewStatus__WEBPACK_IMPORTED_MODULE_27__.ViewStatus.InvalidViewport;
118329
118346
  if (view.is3d() && view.isCameraOn) {
118330
- const centerNpc = newCenter ? this.worldToNpc(newCenter) : _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.NpcCenter.clone();
118331
- const scaleTransform = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Transform.createFixedPointAndMatrix(centerNpc, _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Matrix3d.createScale(factor, factor, 1.0));
118332
- const offset = centerNpc.minus(_itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.NpcCenter); // offset by difference of old/new center
118333
- offset.z = 0.0; // z center stays the same.
118334
- const offsetTransform = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Transform.createTranslationXYZ(offset.x, offset.y, offset.z);
118335
- const product = offsetTransform.multiplyTransformTransform(scaleTransform);
118336
- const frust = new _itwin_core_common__WEBPACK_IMPORTED_MODULE_2__.Frustum();
118337
- product.multiplyPoint3dArrayInPlace(frust.points);
118338
- this.npcToWorldArray(frust.points);
118339
- view.setupFromFrustum(frust);
118340
- view.centerEyePoint();
118347
+ const eyePoint = view.getEyePoint().clone();
118348
+ const targetPoint = view.getTargetPoint();
118349
+ if (newCenter) {
118350
+ const dir = eyePoint.vectorTo(targetPoint);
118351
+ newCenter.plusScaled(dir, -0.5, eyePoint);
118352
+ newCenter.plusScaled(dir, 0.5, targetPoint);
118353
+ }
118354
+ const transform = _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Transform.createFixedPointAndMatrix(targetPoint, _itwin_core_geometry__WEBPACK_IMPORTED_MODULE_1__.Matrix3d.createScale(factor, factor, factor));
118355
+ const zDir = view.getZVector();
118356
+ transform.multiplyPoint3d(eyePoint, eyePoint);
118357
+ targetPoint.setFrom(eyePoint.plusScaled(zDir, zDir.dotProduct(eyePoint.vectorTo(targetPoint))));
118358
+ const status = view.lookAt({ eyePoint, targetPoint, upVector: view.getYVector(), lensAngle: view.camera.lens });
118359
+ if (_ViewStatus__WEBPACK_IMPORTED_MODULE_27__.ViewStatus.Success !== status)
118360
+ return status;
118341
118361
  }
118342
118362
  else {
118343
118363
  // for non-camera views, do the zooming by adjusting the origin and delta directly so there can be no
@@ -292875,7 +292895,7 @@ class TestContext {
292875
292895
  this.initializeRpcInterfaces({ title: this.settings.Backend.name, version: this.settings.Backend.version });
292876
292896
  const iModelClient = new imodels_client_management_1.IModelsClient({ api: { baseUrl: `https://${(_a = process.env.IMJS_URL_PREFIX) !== null && _a !== void 0 ? _a : ""}api.bentley.com/imodels` } });
292877
292897
  await core_frontend_1.NoRenderApp.startup({
292878
- applicationVersion: "3.6.0-dev.3",
292898
+ applicationVersion: "3.6.0-dev.5",
292879
292899
  applicationId: this.settings.gprid,
292880
292900
  authorizationClient: new frontend_1.TestFrontendAuthorizationClient(this.adminUserAccessToken),
292881
292901
  hubAccess: new imodels_access_frontend_1.FrontendIModelsAccess(iModelClient),
@@ -312003,7 +312023,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P
312003
312023
  /***/ ((module) => {
312004
312024
 
312005
312025
  "use strict";
312006
- module.exports = JSON.parse('{"name":"@itwin/core-frontend","version":"3.6.0-dev.3","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs","build:ci":"npm run -s build && npm run -s build:esm","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2020 --outDir lib/esm","clean":"rimraf lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","docs":"betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/primitives,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-eslintrc -c \\"../../tools/eslint-plugin/dist/configs/extension-exports-config.js\\" \\"./src/**/*.ts\\" 1>&2","lint":"eslint -f visualstudio \\"./src/**/*.ts\\" 1>&2","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run -s webpackTests && certa -r chrome","cover":"npm -s test","test:debug":"certa -r chrome --debug","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core/tree/master/core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:^3.6.0-dev.3","@itwin/core-bentley":"workspace:^3.6.0-dev.3","@itwin/core-common":"workspace:^3.6.0-dev.3","@itwin/core-geometry":"workspace:^3.6.0-dev.3","@itwin/core-orbitgt":"workspace:^3.6.0-dev.3","@itwin/core-quantity":"workspace:^3.6.0-dev.3","@itwin/webgl-compatibility":"workspace:^3.6.0-dev.3"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/certa":"workspace:*","@itwin/eslint-plugin":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@types/chai":"4.3.1","@types/chai-as-promised":"^7","@types/deep-assign":"^0.1.0","@types/lodash":"^4.14.0","@types/mocha":"^8.2.2","@types/node":"18.11.5","@types/qs":"^6.5.0","@types/semver":"7.3.10","@types/superagent":"^4.1.14","@types/sinon":"^9.0.0","babel-loader":"~8.2.5","babel-plugin-istanbul":"~6.1.1","chai":"^4.1.2","chai-as-promised":"^7","cpx2":"^3.0.0","eslint":"^7.11.0","glob":"^7.1.2","mocha":"^10.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.0.2","source-map-loader":"^4.0.0","typescript":"~4.4.0","webpack":"^5.64.4"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/object-storage-azure":"~1.4.0","@itwin/cloud-agnostic-core":"~1.4.0","@itwin/object-storage-core":"~1.4.0","@itwin/core-i18n":"workspace:*","@itwin/core-telemetry":"workspace:*","@loaders.gl/core":"^3.1.6","@loaders.gl/draco":"^3.1.6","deep-assign":"^2.0.0","fuse.js":"^3.3.0","lodash":"^4.17.10","qs":"^6.5.1","semver":"^7.3.5","superagent":"7.1.3","wms-capabilities":"0.4.0","xml-js":"~1.6.11","reflect-metadata":"0.1.13"},"nyc":{"extends":"./node_modules/@itwin/build-tools/.nycrc"},"eslintConfig":{"plugins":["@itwin"],"extends":"plugin:@itwin/itwinjs-recommended","rules":{"@itwin/no-internal-barrel-imports":["error",{"required-barrel-modules":["./src/tile/internal.ts"]}],"@itwin/public-extension-exports":["error",{"releaseTags":["public","preview"],"outputApiFile":false}]},"overrides":[{"files":["*.test.ts","*.test.tsx","**/test/**/*.ts"],"rules":{"@itwin/no-internal-barrel-imports":"off"}}]}}');
312026
+ module.exports = JSON.parse('{"name":"@itwin/core-frontend","version":"3.6.0-dev.5","description":"iTwin.js frontend components","main":"lib/cjs/core-frontend.js","module":"lib/esm/core-frontend.js","typings":"lib/cjs/core-frontend","license":"MIT","scripts":{"build":"npm run -s copy:public && npm run -s build:cjs","build:ci":"npm run -s build && npm run -s build:esm","build:cjs":"npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs","build:esm":"npm run -s copy:js:esm && tsc 1>&2 --module ES2020 --outDir lib/esm","clean":"rimraf lib .rush/temp/package-deps*.json","copy:public":"cpx \\"./src/public/**/*\\" ./lib/public","copy:js:cjs":"cpx \\"./src/**/*.js\\" ./lib/cjs","copy:js:esm":"cpx \\"./src/**/*.js\\" ./lib/esm","docs":"betools docs --includes=../../generated-docs/extract --json=../../generated-docs/core/core-frontend/file.json --tsIndexFile=./core-frontend.ts --onlyJson --excludes=webgl/**/*,**/primitives,**/map/*.d.ts,**/tile/*.d.ts,**/*-css.ts","extract-api":"betools extract-api --entry=core-frontend && npm run extract-extension-api","extract-extension-api":"eslint --no-eslintrc -c \\"../../tools/eslint-plugin/dist/configs/extension-exports-config.js\\" \\"./src/**/*.ts\\" 1>&2","lint":"eslint -f visualstudio \\"./src/**/*.ts\\" 1>&2","pseudolocalize":"betools pseudolocalize --englishDir ./src/public/locales/en --out ./public/locales/en-PSEUDO","test":"npm run -s webpackTests && certa -r chrome","cover":"npm -s test","test:debug":"certa -r chrome --debug","webpackTests":"webpack --config ./src/test/utils/webpack.config.js 1>&2"},"repository":{"type":"git","url":"https://github.com/iTwin/itwinjs-core/tree/master/core/frontend"},"keywords":["Bentley","BIM","iModel","digital-twin","iTwin"],"author":{"name":"Bentley Systems, Inc.","url":"http://www.bentley.com"},"peerDependencies":{"@itwin/appui-abstract":"workspace:^3.6.0-dev.5","@itwin/core-bentley":"workspace:^3.6.0-dev.5","@itwin/core-common":"workspace:^3.6.0-dev.5","@itwin/core-geometry":"workspace:^3.6.0-dev.5","@itwin/core-orbitgt":"workspace:^3.6.0-dev.5","@itwin/core-quantity":"workspace:^3.6.0-dev.5","@itwin/webgl-compatibility":"workspace:^3.6.0-dev.5"},"//devDependencies":["NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install","NOTE: All tools used by scripts in this package must be listed as devDependencies"],"devDependencies":{"@itwin/appui-abstract":"workspace:*","@itwin/build-tools":"workspace:*","@itwin/core-bentley":"workspace:*","@itwin/core-common":"workspace:*","@itwin/core-geometry":"workspace:*","@itwin/core-orbitgt":"workspace:*","@itwin/core-quantity":"workspace:*","@itwin/certa":"workspace:*","@itwin/eslint-plugin":"workspace:*","@itwin/webgl-compatibility":"workspace:*","@types/chai":"4.3.1","@types/chai-as-promised":"^7","@types/deep-assign":"^0.1.0","@types/lodash":"^4.14.0","@types/mocha":"^8.2.2","@types/node":"18.11.5","@types/qs":"^6.5.0","@types/semver":"7.3.10","@types/superagent":"^4.1.14","@types/sinon":"^9.0.0","babel-loader":"~8.2.5","babel-plugin-istanbul":"~6.1.1","chai":"^4.1.2","chai-as-promised":"^7","cpx2":"^3.0.0","eslint":"^7.11.0","glob":"^7.1.2","mocha":"^10.0.0","nyc":"^15.1.0","rimraf":"^3.0.2","sinon":"^9.0.2","source-map-loader":"^4.0.0","typescript":"~4.4.0","webpack":"^5.64.4"},"//dependencies":["NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API","NOTE: core-frontend should remain UI technology agnostic, so no react/angular dependencies are allowed"],"dependencies":{"@itwin/object-storage-azure":"~1.4.0","@itwin/cloud-agnostic-core":"~1.4.0","@itwin/object-storage-core":"~1.4.0","@itwin/core-i18n":"workspace:*","@itwin/core-telemetry":"workspace:*","@loaders.gl/core":"^3.1.6","@loaders.gl/draco":"^3.1.6","deep-assign":"^2.0.0","fuse.js":"^3.3.0","lodash":"^4.17.10","qs":"^6.5.1","semver":"^7.3.5","superagent":"7.1.3","wms-capabilities":"0.4.0","xml-js":"~1.6.11","reflect-metadata":"0.1.13"},"nyc":{"extends":"./node_modules/@itwin/build-tools/.nycrc"},"eslintConfig":{"plugins":["@itwin"],"extends":"plugin:@itwin/itwinjs-recommended","rules":{"@itwin/no-internal-barrel-imports":["error",{"required-barrel-modules":["./src/tile/internal.ts"]}],"@itwin/public-extension-exports":["error",{"releaseTags":["public","preview"],"outputApiFile":false}]},"overrides":[{"files":["*.test.ts","*.test.tsx","**/test/**/*.ts"],"rules":{"@itwin/no-internal-barrel-imports":"off"}}]}}');
312007
312027
 
312008
312028
  /***/ }),
312009
312029