auphong2707/dl4se-code-review-dataset huggingface dataset:
Source:
<code>private ApplicationManager createSourceAndDeployApp(String appName, File file, String format, String outputDatasetName, Schema schema) throws Exception { String schemaString = null; if (schema != null) { schemaString = schema.toString(); } ETLStage source; if (schema != null) { source = new ETLStage( "source", new ETLPlugin("File", BatchSource.PLUGIN_TYPE, ImmutableMap.<String, String>builder() <START> .put(Constants.Reference.REFERENCE_NAME, "TestFile") <END> .put(Properties.File.FILESYSTEM, "Text") .put(Properties.File.PATH, file.getAbsolutePath()) .put(Properties.File.FORMAT, format) .put(Properties.File.IGNORE_NON_EXISTING_FOLDERS, "false") .put("pathField", "file") .put(Properties.File.SCHEMA, schemaString) .build(), null)); } else { source = new ETLStage( "source", new ETLPlugin("File", BatchSource.PLUGIN_TYPE, ImmutableMap.<String, String>builder() .put(Constants.Reference.REFERENCE_NAME, "TestFile") .put(Properties.File.FILESYSTEM, "Text") .put(Properties.File.PATH, file.getAbsolutePath()) .put(Properties.File.FORMAT, format) .put(Properties.File.IGNORE_NON_EXISTING_FOLDERS, "false") .put("pathField", "file") .build(), null)); } ETLStage sink = new ETLStage("sink", MockSink.getPlugin(outputDatasetName)); ETLBatchConfig etlConfig = ETLBatchConfig.builder("* * * * *") .addStage(source) .addStage(sink) .addConnection(source.getName(), sink.getName()) .build(); AppRequest<ETLBatchConfig> appRequest = new AppRequest<>(BATCH_ARTIFACT, etlConfig); ApplicationId appId = NamespaceId.DEFAULT.app(appName); ApplicationManager appManager = deployApplication(appId, appRequest); return appManager; }</code><technical_language>this is unnecessary repeat code. need do if schema is null is put schema property in ImmutableMap builder</technical_language>

Target:
private ApplicationManager createSourceAndDeployApp(String appName, File file, String format, String outputDatasetName, Schema schema) throws Exception { ImmutableMap.Builder<String, String> sourceProperties = ImmutableMap.<String, String>builder() .put(Constants.Reference.REFERENCE_NAME, "TestFile") .put(Properties.File.FILESYSTEM, "Text") .put(Properties.File.PATH, file.getAbsolutePath()) .put(Properties.File.FORMAT, format) .put(Properties.File.IGNORE_NON_EXISTING_FOLDERS, "false") .put("pathField", "file"); if (schema != null) { String schemaString = schema.toString(); sourceProperties.put(Properties.File.SCHEMA, schemaString); } ETLStage source = new ETLStage( "source", new ETLPlugin("File", BatchSource.PLUGIN_TYPE, sourceProperties.build(), null)); ETLStage sink = new ETLStage("sink", MockSink.getPlugin(outputDatasetName)); ETLBatchConfig etlConfig = ETLBatchConfig.builder("* * * * *") .addStage(source) .addStage(sink) .addConnection(source.getName(), sink.getName()) .build(); AppRequest<ETLBatchConfig> appRequest = new AppRequest<>(BATCH_ARTIFACT, etlConfig); ApplicationId appId = NamespaceId.DEFAULT.app(appName); ApplicationManager appManager = deployApplication(appId, appRequest); return appManager; }
Source:
<code>private static ClassSymbolImpl classSymbol(String name, String fullyQualifiedName) { <START> ClassSymbolImpl djangoHttpResponseRedirect = new ClassSymbolImpl(name, fullyQualifiedName); <END> djangoHttpResponseRedirect.setHasUnresolvedTypeHierarchy(false); return djangoHttpResponseRedirect; }</code><technical_language>I forgot rename this variable</technical_language>

Target:
private static ClassSymbolImpl classSymbol(String name, String fullyQualifiedName) { ClassSymbolImpl classSymbol = new ClassSymbolImpl(name, fullyQualifiedName); classSymbol.setHasUnresolvedTypeHierarchy(false); return classSymbol; }
Source:
<code>public void deleteBlobsByDirectory(String containerName, String directoryName, boolean recursive) { List<BlobEntity> blobs = findBlobsByDirectory(containerName, directoryName, false); for (BlobEntity blob : blobs) { if (!blob.isDirectory()) { deleteBlob(containerName, blob.getKey()); } else { if (recursive) { <START> deleteBlob(containerName, blob.getKey()); <END> deleteBlobsByDirectory(containerName, blob.getKey(), true); } } } }</code><technical_language>this deleted _after_ blobs in directory deleted, recursive call</technical_language>

Target:
public void deleteBlobsByDirectory(String containerName, String directoryName, boolean recursive) { List<BlobEntity> blobs = findBlobsByDirectory(containerName, directoryName, false); for (BlobEntity blob : blobs) { if (!blob.isDirectory()) { deleteBlob(containerName, blob.getKey()); } else { if (recursive) { deleteBlobsByDirectory(containerName, blob.getKey(), true); deleteBlob(containerName, blob.getKey()); } } } }
Source:
<code>public FileSystem getFileSystem(URI uri) { String accountName = extractAccountName(uri); if (!this.openFileSystems.containsKey(accountName)) { <START> throw new FileSystemNotFoundException(); <END> } return this.openFileSystems.get(accountName); }</code><technical_language>name of FileSystem included in this message? troubleshooting issues</technical_language>

Target:
public FileSystem getFileSystem(URI uri) { String accountName = extractAccountName(uri); if (!this.openFileSystems.containsKey(accountName)) { throw Utility.logError(this.logger, new FileSystemNotFoundException("Name: " + accountName)); } return this.openFileSystems.get(accountName); }
Source:
<code><START> public int getRetryAspectOrder() { <END> return Ordered.LOWEST_PRECEDENCE - 3; }</code><technical_language>Variable</technical_language>

Target:
public int getRetryAspectOrder() { return retryAspectOrder; }
Source:
<code>public String toString() { <START> if (mVars.size() == 0) { <END> return null; } JSONObject jsonObject; synchronized (mConcurrentLock) { jsonObject = new JSONObject(mVars); } return jsonObject.toString(); }</code><technical_language>Assuming change ConcurrentHashMap. JSONObject json = new JSONObject(mVars); return json.length() > 0 ? json.toString() : null; is a race condition issue this fixes (we noticed yet). passing == 0 check, map emptied copy it. return empty String instead of a null String</technical_language>

Target:
public String toString() { JSONObject json = new JSONObject(mVars); return json.length() > 0 ? json.toString() : null; }
Source:
<code>private int readWithFilter(int[] positions, int positionCount) throws IOException { int streamPosition = 0; outputPositionCount = 0; for (int i = 0; i < positionCount; i++) { int position = positions[i]; if (position > streamPosition) { skip(position - streamPosition); streamPosition = position; } if (presentStream != null && !presentStream.nextBit()) { <START> if (nullsAllowed) { <END> if (outputRequired) { nulls[outputPositionCount] = true; } outputPositions[outputPositionCount] = position; outputPositionCount++; } } else { double value = dataStream.next(); if (filter.testDouble(value)) { if (outputRequired) { values[outputPositionCount] = doubleToLongBits(value); if (nullsAllowed && presentStream != null) { nulls[outputPositionCount] = false; } } outputPositions[outputPositionCount] = position; outputPositionCount++; } } streamPosition++; } return streamPosition; }</code><technical_language>check for nonDeterministicFilter</technical_language>

Target:
private int readWithFilter(int[] positions, int positionCount) throws IOException { int streamPosition = 0; outputPositionCount = 0; for (int i = 0; i < positionCount; i++) { int position = positions[i]; if (position > streamPosition) { skip(position - streamPosition); streamPosition = position; } if (presentStream != null && !presentStream.nextBit()) { if ((nonDeterministicFilter && filter.testNull()) || nullsAllowed) { if (outputRequired) { nulls[outputPositionCount] = true; } outputPositions[outputPositionCount] = position; outputPositionCount++; } } else { double value = dataStream.next(); if (filter.testDouble(value)) { if (outputRequired) { values[outputPositionCount] = doubleToLongBits(value); if (nullsAllowed && presentStream != null) { nulls[outputPositionCount] = false; } } outputPositions[outputPositionCount] = position; outputPositionCount++; } } streamPosition++; if (filter != null) { outputPositionCount -= filter.getPrecedingPositionsToFail(); int succeedingPositionsToFail = filter.getSucceedingPositionsToFail(); if (succeedingPositionsToFail > 0) { int positionsToSkip = 0; for (int j = 0; j < succeedingPositionsToFail; j++) { i++; int nextPosition = positions[i]; positionsToSkip += 1 + nextPosition - streamPosition; streamPosition = nextPosition + 1; } skip(positionsToSkip); } } } return streamPosition; }
Source:
<code>public void run() { InetSocketAddress publicInetAddress = null; try { publicInetAddress = performStunDiscovery( new InetSocketAddress(stunAddress, stunPort), new InetSocketAddress(localAddress, 0), timeout); } catch (PortUnreachableException e) { <START> log.info("Aborted stun discovery - ICMP port unreachable: " + e.getMessage()); <END> return; } catch (IOException e) { log.error("an error occurred while performing a STUN discovery: " + e.getMessage(), e); return; } catch (Exception e) { log.error( "an internal error occurred while performing a STUN discovery: " + e.getMessage(), e); return; } if (publicInetAddress.getAddress().isAnyLocalAddress()) return; synchronized (StunServiceImpl.this) { if (publicInetAddress.getAddress().equals(localAddress)) isDirectConnection = true; log.debug( "discovered public WAN-IP: " + publicInetAddress.getAddress().getHostAddress() + " through interface " + localAddress.getHostAddress()); publicIPAddresses.add(publicInetAddress); } }</code><technical_language>This exception is raised receive ICMP packet stating port (in this case UDP) is reachable. message reads ICMP port is reachable. Guess forgot a delimiter ICMP. I suggest log this as: warning debug. is point of logging this info</technical_language>

Target:
public void run() { InetSocketAddress publicInetAddress = null; try { publicInetAddress = performStunDiscovery( new InetSocketAddress(stunAddress, stunPort), new InetSocketAddress(localAddress, 0), timeout); } catch (PortUnreachableException e) { log.warn("aborted STUN discovery: " + e.getMessage()); return; } catch (IOException e) { log.error("an error occurred while performing a STUN discovery: " + e.getMessage(), e); return; } catch (Exception e) { log.error( "an internal error occurred while performing a STUN discovery: " + e.getMessage(), e); return; } if (publicInetAddress.getAddress().isAnyLocalAddress()) return; synchronized (StunServiceImpl.this) { if (publicInetAddress.getAddress().equals(localAddress)) isDirectConnection = true; log.debug( "discovered public WAN-IP: " + publicInetAddress.getAddress().getHostAddress() + " through interface " + localAddress.getHostAddress()); publicIPAddresses.add(publicInetAddress); } }
Source:
<code>public void close() { for (BufferAggregator aggregator : aggregators) { try { aggregator.close(); } catch (Exception e) { <START> log.warn(e, "Could not close aggregator, skipping."); <END> } } }</code><technical_language>print aggregator</technical_language>

Target:
public void close() { for (BufferAggregator aggregator : aggregators) { try { aggregator.close(); } catch (Exception e) { log.warn(e, "Could not close aggregator [%s], skipping.", aggregator); } } }
Source:
<code>@NonNull @Override public Request transformRequest(@NonNull Request request) { if (request.resourceId != 0) { return request; } Uri uri = request.uri; if (uri == null) { <START> throw new IllegalStateException("Null uri passed to " + getClass().getCanonicalName()); <END> } String scheme = uri.getScheme(); if (!"https".equals(scheme) && !"http".equals(scheme)) { return request; } if (!request.hasSize() && !alwaysTransform) { return request; } Request.Builder newRequest = request.newBuilder(); ThumborUrlBuilder urlBuilder = thumbor.buildImage(uri.toString()); if (request.hasSize()) { urlBuilder.resize(request.targetWidth, request.targetHeight); newRequest.clearResize(); } if (request.centerInside) { urlBuilder.fitIn(); newRequest.clearCenterInside(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { urlBuilder.filter(format(ImageFormat.WEBP)); } newRequest.setUri(Uri.parse(urlBuilder.toUrl())); return newRequest.build(); }</code><technical_language>IllegalArgumentException</technical_language>

Target:
@NonNull @Override public Request transformRequest(@NonNull Request request) { if (request.resourceId != 0) { return request; } Uri uri = request.uri; if (uri == null) { throw new IllegalArgumentException("Null uri passed to " + getClass().getCanonicalName()); } String scheme = uri.getScheme(); if (!"https".equals(scheme) && !"http".equals(scheme)) { return request; } if (!request.hasSize() && !alwaysTransform) { return request; } Request.Builder newRequest = request.newBuilder(); ThumborUrlBuilder urlBuilder = thumbor.buildImage(uri.toString()); if (request.hasSize()) { urlBuilder.resize(request.targetWidth, request.targetHeight); newRequest.clearResize(); } if (request.centerInside) { urlBuilder.fitIn(); newRequest.clearCenterInside(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { urlBuilder.filter(format(ImageFormat.WEBP)); } newRequest.setUri(Uri.parse(urlBuilder.toUrl())); return newRequest.build(); }
Source:
<code>public void TwitterWidgetTest_002_areLoaded() { TwitterWidgetPageObject twitterWidget = new TwitterWidgetPageObject(driver); twitterWidget.createMultiple().navigate(wikiURL); <START> Assertion.assertTrue( <END> twitterWidget.areAllValidSwappedForIFrames(), MercuryMessages.SOME_VALID_WIDGETS_WERE_NOT_SWAPPED_MSG ); Assertion.assertTrue( twitterWidget.areLoaded(), MercuryMessages.INVISIBLE_MSG ); }</code><technical_language>inline please</technical_language>

Target:
public void TwitterWidgetTest_002_areLoaded() { TwitterWidgetPageObject widget = new TwitterWidgetPageObject(driver); widget.createMultiple().navigate(wikiURL); Assertion.assertTrue( widget.areAllValidSwappedForIFrames(), MercuryMessages.SOME_VALID_WIDGETS_WERE_NOT_SWAPPED_MSG ); Assertion.assertTrue(widget.areLoaded(), MercuryMessages.INVISIBLE_MSG); }
Source:
<code>Mono<ServiceBusReceiverAsyncClient> createConsumerWithReceiveLink() { return Mono.defer(() -> { <START> getOrCreateConsumer(); <END> return Mono.just(this); }); }</code><technical_language>question. get forget returned result</technical_language>

Target:
Mono<ServiceBusAsyncConsumer> createConsumerWithReceiveLink() { return Mono.fromCallable(this::getOrCreateConsumer); }
Source:
<code>protected void onAttach(AttachEvent attachEvent) { super.onAttach(attachEvent); if (attachEvent.isInitialAttach()) { if (!getUI().isPresent()) { throw new IllegalStateException( "The component needs to be attached to an UI."); } addClassName("tablesorter"); <START> getUI().get().getPage().executeJavaScript( <END> "jQuery($0).tablesorter({ theme : 'bootstrap', widgets : [ 'group', 'filter', 'columns', 'zebra' ] });", getElement()); } if (!updated) { updateContent(); } }</code><technical_language>![MAJOR](<LINK_1> 'Severity: MAJOR') Call "Optional#isPresent()" accessing value. [![rule](<LINK_2>](<LINK_0></technical_language>

Target:
protected void onAttach(AttachEvent attachEvent) { super.onAttach(attachEvent); if (attachEvent.isInitialAttach()) { if (!getUI().isPresent()) { throw new IllegalStateException( "The component needs to be attached to an UI."); } addClassName("tablesorter"); getUI().get().getPage().executeJavaScript( "jQuery($0).tablesorter({ theme : 'bootstrap', widgets : [ 'group', 'filter', 'columns', 'zebra' ] });", getElement()); updateContentIfAttached(); } }
Source:
<code>private void exit() { if (serviceContainer != null) { try { serviceContainer.shutdown(); serviceContainer.awaitTermination(); } catch (RuntimeException rte) { throw rte; } catch (InterruptedException ite) { <START> ServerLogger.ROOT_LOGGER.error(ite.getLocalizedMessage(), ite); <END> Thread.currentThread().interrupt(); } catch (Exception ex) { ServerLogger.ROOT_LOGGER.error(ex.getLocalizedMessage(), ex); } } if (controlledProcessStateService != null) { controlledProcessStateService.removePropertyChangeListener(processStateListener); controlledProcessStateService = null; } if (executorService != null) { try { executorService.shutdown(); executorService.awaitTermination(10, TimeUnit.SECONDS); } catch (RuntimeException rte) { throw rte; } catch (InterruptedException ite) { ServerLogger.ROOT_LOGGER.error(ite.getLocalizedMessage(), ite); Thread.currentThread().interrupt(); } catch (Exception ex) { ServerLogger.ROOT_LOGGER.error(ex.getLocalizedMessage(), ex); } } if (uninstallStdIo) { try { StdioContext.uninstall(); } catch (IllegalStateException ignored) { } } SystemExiter.initialize(SystemExiter.Exiter.DEFAULT); }</code><technical_language>@luck3y I fixes in this file EmbeddedHostControllerFactory EmbeddedLogger.ROOT_LOGGER, *existing* of ServerLogger in EmbeddedHostControllerFactory switch EmbeddedLogger. (AFAICT ServerLogger messages class move.) EmbeddedHostControllerFactory change a task for you, necessarily for this PR. WDYT</technical_language>

Target:
private void exit() { if (serviceContainer != null) { try { serviceContainer.shutdown(); serviceContainer.awaitTermination(); } catch (RuntimeException rte) { throw rte; } catch (InterruptedException ite) { EmbeddedLogger.ROOT_LOGGER.error(ite.getLocalizedMessage(), ite); Thread.currentThread().interrupt(); } catch (Exception ex) { EmbeddedLogger.ROOT_LOGGER.error(ex.getLocalizedMessage(), ex); } } if (controlledProcessStateService != null) { controlledProcessStateService.removePropertyChangeListener(processStateListener); controlledProcessStateService = null; } if (executorService != null) { try { executorService.shutdown(); executorService.awaitTermination(10, TimeUnit.SECONDS); } catch (RuntimeException rte) { throw rte; } catch (InterruptedException ite) { EmbeddedLogger.ROOT_LOGGER.error(ite.getLocalizedMessage(), ite); Thread.currentThread().interrupt(); } catch (Exception ex) { EmbeddedLogger.ROOT_LOGGER.error(ex.getLocalizedMessage(), ex); } } if (uninstallStdIo) { try { StdioContext.uninstall(); } catch (IllegalStateException ignored) { } } SystemExiter.initialize(SystemExiter.Exiter.DEFAULT); }
Source:
<code>public void failsOnUnsupportedAcceptHeader() throws IOException { <START> final TkProduces produces = new TkProduces( <END> new TkEmpty(), "text/json,application/json" ); produces.act( new RqFake( Arrays.asList( "GET /hz0", "Host: as0.example.com", "Accept: text/xml" ), "" ) ).head(); }</code><technical_language>enough do final produces. IDE give a warning here... try settings for IntelliJ: <LINK_0></technical_language>

Target:
public void failsOnUnsupportedAcceptHeader() throws IOException { final Take produces = new TkProduces( new TkEmpty(), "text/json,application/json" ); produces.act( new RqFake( Arrays.asList( "GET /hz0", "Host: as0.example.com", "Accept: text/xml" ), "" ) ).head(); }
Source:
<code>@Override public IgniteCache<K, V> withReadRepair() { CacheOperationGate opGate = onEnter(); try { if (context().mvccEnabled()) { throw new UnsupportedOperationException( <START> "The TRANSACTIONAL_SNAPSHOT mode does not support the read-repair feature."); <END> } if (context().isNear()) throw new UnsupportedOperationException("Read-repair is not supported by near caches."); if (context().readThrough()) { throw new UnsupportedOperationException("Read-repair is not supported by caches with readThrough enabled."); } if (context().isLocal()) throw new UnsupportedOperationException("Read-repair is not supported by local caches."); if (context().config().getBackups() == 0) { throw new UnsupportedOperationException("Read-repair is suitable only in case " + "at least 1 backup configured for cache."); } boolean readRepair = opCtx.readRepair(); if (readRepair) return this; return new GatewayProtectedCacheProxy<>(delegate, opCtx.setReadRepair(true), lock); } finally { onLeave(opGate); } }</code><technical_language>is supported by</technical_language>

Target:
@Override public IgniteCache<K, V> withReadRepair() { CacheOperationGate opGate = onEnter(); try { if (context().mvccEnabled()) { throw new UnsupportedOperationException( "The TRANSACTIONAL_SNAPSHOT mode is incompatible with the read-repair feature."); } if (context().isNear()) throw new UnsupportedOperationException("Read-repair is incompatible with near caches."); if (context().readThrough()) { throw new UnsupportedOperationException("Read-repair is incompatible with caches that use readThrough."); } if (context().isLocal()) throw new UnsupportedOperationException("Read-repair is incompatible with local caches."); if (context().config().getBackups() == 0) { throw new UnsupportedOperationException("Read-repair is suitable only in case " + "at least 1 backup configured for cache."); } boolean readRepair = opCtx.readRepair(); if (readRepair) return this; return new GatewayProtectedCacheProxy<>(delegate, opCtx.setReadRepair(true), lock); } finally { onLeave(opGate); } }
Source:
<code><START> Object getPrimitiveTypeObject(PrimitiveType.PrimitiveTypeName primitiveTypeName, int field, int index, Group row, Type fieldType) { <END> switch (primitiveTypeName) { case INT96: byte[] bytes = row.getInt96(field, index).getBytesUnsafe(); BigInteger bigInteger = new BigInteger(bytes); return bigInteger; case INT64: return row.getLong(field, index); case INT32: return row.getInteger(field, index); case BOOLEAN: return row.getBoolean(field, index); case FLOAT: return row.getFloat(field, index); case DOUBLE: return row.getDouble(field, index); case BINARY: if ("STRING".equals(fieldType.getLogicalTypeAnnotation().toString())) { return row.getBinary(field, index).toStringUsingUTF8(); } return row.getBinary(field, index); } return null; }</code><technical_language>is enum for FIXED_LEN_BYTE_ARRAY - need handled</technical_language>

Target:
Object getPrimitiveTypeObject(PrimitiveType.PrimitiveTypeName primitiveTypeName, int field, int index, Group row, Type fieldType) { switch (primitiveTypeName) { case INT96: byte[] bytes = row.getInt96(field, index).getBytesUnsafe(); BigInteger bigInteger = new BigInteger(bytes); return bigInteger; case INT64: return row.getLong(field, index); case INT32: return row.getInteger(field, index); case BOOLEAN: return row.getBoolean(field, index); case FLOAT: return row.getFloat(field, index); case DOUBLE: return row.getDouble(field, index); case BINARY: if ("STRING".equals(fieldType.getLogicalTypeAnnotation().toString())) { return row.getBinary(field, index).toStringUsingUTF8(); } bytes = row.getBinary(field, index).getBytesUnsafe(); return bytes; case FIXED_LEN_BYTE_ARRAY: bytes = row.getBinary(field, index).getBytesUnsafe(); return bytes; } return null; }
Source:
<code><START> public List<String> getCountries(String startsWith) { String[] countries = Locale.getISOCountries(); if(startsWith == null) { return Arrays.asList(countries); } startsWith = startsWith.toLowerCase(); ArrayList<String> result = new ArrayList(countries.length); for(String country : countries) { if(country.toLowerCase().startsWith(startsWith)) result.add(country); } return result; } <END></code><technical_language>A lot of code for a simple thing: suggestion return Arrays.stream(Locale.getISOCountries()) .filter(country -> startsWith == null || country.startsWith(startsWith)) .collect(Collectors.toList());</technical_language>

Target:
public List<String> getCountries(String startsWith) { if (startsWith == null) { return Arrays.stream(Locale.getISOCountries()).collect(Collectors.toList()); } final String startsWithLowered = startsWith.toLowerCase(); return Arrays.stream(Locale.getISOCountries()) .filter(country -> matchCountry(country, startsWithLowered)) .collect(Collectors.toList()); }
Source:
<code>public boolean validateBillingFrequency(ContractsAndGrantsBillingAward award) { String awardInvoiceOption = award.getInvoicingOptionCode(); Date lastBilledDateToUse; if (StringUtils.equals(awardInvoiceOption, ArConstants.INV_CONTRACT_CONTROL_ACCOUNT) || StringUtils.equals(awardInvoiceOption, ArConstants.INV_ACCOUNT)) { <START> lastBilledDateToUse = award.getActiveAwardAccounts().get(0).getCurrentLastBilledDate(); <END> } else { lastBilledDateToUse = award.getLastBilledDate(); } return validateBillingFrequency(award, lastBilledDateToUse); }</code><technical_language>this code need verify activeAwardAccounts collection is non-empty</technical_language>

Target:
public boolean validateBillingFrequency(ContractsAndGrantsBillingAward award) { String awardInvoiceOption = award.getInvoicingOptionCode(); Date lastBilledDateToUse; if (StringUtils.equals(awardInvoiceOption, ArConstants.INV_CONTRACT_CONTROL_ACCOUNT) || StringUtils.equals(awardInvoiceOption, ArConstants.INV_ACCOUNT)) { if (CollectionUtils.isNotEmpty(award.getActiveAwardAccounts())) { lastBilledDateToUse = award.getActiveAwardAccounts().get(0).getCurrentLastBilledDate(); } else { LOG.error("validateBillingFrequency: NO active award accounts on Award with invoice option of Account or Contract Control Account. Award lastBilledDate being used for CINV creation."); lastBilledDateToUse = award.getLastBilledDate(); } } else { lastBilledDateToUse = award.getLastBilledDate(); } return validateBillingFrequency(award, lastBilledDateToUse); }
Source:
<code>public void set( long index, byte[] value ) { assert value.length == entrySize; long pageId = pageId( index ); int offset = offset( index ); <START> try ( PageCursor cursor = pagedFile.io( pageId, PF_SHARED_WRITE_LOCK | PF_NO_GROW ); ) <END> { cursor.next(); for ( int i = 0; i < value.length; i++ ) { cursor.putByte( offset + i, value[i] ); } checkBounds( cursor ); } catch ( IOException e ) { throw new UncheckedIOException( e ); } }</code><technical_language>unnecessary semicolons in some other try blocks for page cursor creation</technical_language>

Target:
public void set( long index, byte[] value ) { assert value.length == entrySize; long pageId = pageId( index ); int offset = offset( index ); try ( PageCursor cursor = pagedFile.io( pageId, PF_SHARED_WRITE_LOCK | PF_NO_GROW ) ) { cursor.next(); for ( int i = 0; i < value.length; i++ ) { cursor.putByte( offset + i, value[i] ); } checkBounds( cursor ); } catch ( IOException e ) { throw new UncheckedIOException( e ); } }
Source:
<code>public InternalPushConnection(PackTransport transport, final ReceivePackFactory<C> receivePackFactory, final C req, final Repository remote) throws TransportException { super(transport); final PipedInputStream in_r; final PipedOutputStream in_w; final PipedInputStream out_r; final PipedOutputStream out_w; try { in_r = new PipedInputStream(); in_w = new PipedOutputStream(in_r); out_r = new PipedInputStream(); out_w = new PipedOutputStream(out_r); } catch (IOException err) { remote.close(); throw new TransportException(uri, JGitText.get().cannotConnectPipes, err); } worker = new Thread("JGit-Receive-Pack") { @Override public void run() { try { final ReceivePack rp = receivePackFactory.create(req, remote); rp.receive(out_r, in_w, System.err); } catch (ServiceNotEnabledException e) { } catch (ServiceNotAuthorizedException e) { } catch (IOException e) { throw new <START> RuntimeException(e); <END> } finally { try { out_r.close(); } catch (IOException e2) { } try { in_w.close(); } catch (IOException e2) { } remote.close(); } } }; worker.start(); init(in_r, out_w); readAdvertisedRefs(); }</code><technical_language>UncheckedIOException</technical_language>

Target:
public InternalPushConnection(PackTransport transport, final ReceivePackFactory<C> receivePackFactory, final C req, final Repository remote) throws TransportException { super(transport); final PipedInputStream in_r; final PipedOutputStream in_w; final PipedInputStream out_r; final PipedOutputStream out_w; try { in_r = new PipedInputStream(); in_w = new PipedOutputStream(in_r); out_r = new PipedInputStream(); out_w = new PipedOutputStream(out_r); } catch (IOException err) { remote.close(); throw new TransportException(uri, JGitText.get().cannotConnectPipes, err); } worker = new Thread("JGit-Receive-Pack") { @Override public void run() { try { final ReceivePack rp = receivePackFactory.create(req, remote); rp.receive(out_r, in_w, System.err); } catch (ServiceNotEnabledException e) { } catch (ServiceNotAuthorizedException e) { } catch (IOException e) { throw new UncheckedIOException(e); } finally { try { out_r.close(); } catch (IOException e2) { } try { in_w.close(); } catch (IOException e2) { } remote.close(); } } }; worker.start(); init(in_r, out_w); readAdvertisedRefs(); }
Source:
<code>public <T> T construct(Class<T> componentType) { if (!configuration.getCacheMode().isClustered()) return null; if (globalConfiguration.getTransportClass() == null) <START> throw new IllegalStateException("Transport should be configured in order to use clustered caches"); <END> return super.construct(componentType); }</code><technical_language>ConfigurationException</technical_language>

Target:
public <T> T construct(Class<T> componentType) { if (!configuration.getCacheMode().isClustered()) return null; if (globalConfiguration.getTransportClass() == null) throw new ConfigurationException("Transport should be configured in order to use clustered caches"); return super.construct(componentType); }
Source:
<code>private Map<Guid, GlusterAsyncTask> updateTasksInCluster(VDSGroup cluster) { if (!supportsGlusterAsyncTasksFeature(cluster)) { return null; } Map<Guid, GlusterAsyncTask> runningTasks = getProvider().getTaskListForCluster(cluster.getId()); if (runningTasks == null) { return null; } <START> Iterator<Entry<Guid, GlusterAsyncTask>> iter = runningTasks.entrySet().iterator(); <END> while (iter.hasNext()) { Entry<Guid, GlusterAsyncTask> entry = iter.next(); Guid taskId = entry.getKey(); GlusterAsyncTask task = entry.getValue(); List<Step> steps = getStepDao().getStepsByExternalId(taskId); for (Step step: steps) { if (step.getEndTime() != null) { continue; } step.setDescription(getTaskMessage(cluster,step,task)); if (hasTaskCompleted(task)) { step.markStepEnded(task.getStatus()); endStepJob(step); releaseVolumeLock(task.getTaskId()); } else { getJobRepository().updateStep(step); } } } return runningTasks; }</code><technical_language>again, for entrySet is nicer, imho</technical_language>

Target:
private Map<Guid, GlusterAsyncTask> updateTasksInCluster(VDSGroup cluster) { if (!supportsGlusterAsyncTasksFeature(cluster)) { return null; } Map<Guid, GlusterAsyncTask> runningTasks = getProvider().getTaskListForCluster(cluster.getId()); if (runningTasks == null) { return null; } for (Entry<Guid, GlusterAsyncTask> entry : runningTasks.entrySet()) { Guid taskId = entry.getKey(); GlusterAsyncTask task = entry.getValue(); List<Step> steps = getStepDao().getStepsByExternalId(taskId); for (Step step: steps) { if (step.getEndTime() != null) { continue; } step.setDescription(getTaskMessage(cluster,step,task)); if (hasTaskCompleted(task)) { step.markStepEnded(task.getStatus()); endStepJob(step); releaseVolumeLock(task.getTaskId()); } else { getJobRepository().updateStep(step); } } } return runningTasks; }
Source:
<code>public void testDetermineMaxQuipHistorySize(){ <START> assertEquals(manager.determineMaxQuipHistorySize(16),8); <END> assertEquals(manager.determineMaxQuipHistorySize(10),5); assertEquals(manager.determineMaxQuipHistorySize(4),2); }</code><technical_language>of test condition. Change this input (max size \* 2) + 1, check output is max size</technical_language>

Target:
public void testDetermineMaxQuipHistorySize(){ assertEquals(QuipManager.determineMaxQuipHistorySize(2*QuipManager.MAXIMUM_QUIP_HISTORY_SIZE+10),QuipManager.MAXIMUM_QUIP_HISTORY_SIZE); assertEquals(QuipManager.determineMaxQuipHistorySize(2*QuipManager.MAXIMUM_QUIP_HISTORY_SIZE),QuipManager.MAXIMUM_QUIP_HISTORY_SIZE); assertEquals(QuipManager.determineMaxQuipHistorySize(2*QuipManager.MAXIMUM_QUIP_HISTORY_SIZE-1),QuipManager.MAXIMUM_QUIP_HISTORY_SIZE-1); assertEquals(QuipManager.determineMaxQuipHistorySize(QuipManager.MAXIMUM_QUIP_HISTORY_SIZE),(int)(QuipManager.MAXIMUM_QUIP_HISTORY_SIZE*QuipManager.MAXIMUM_QUIP_HISTORY_PERCENT)); assertEquals(QuipManager.determineMaxQuipHistorySize(0),0); }
Source:
<code>public Person(String name, Campaign c, String factionCode) { this.name = name; callsign = ""; portraitCategory = Crew.ROOT_PORTRAIT; portraitFile = Crew.PORTRAIT_NONE; portraitCategoryOverride = null; portraitFileOverride = null; xp = 0; acquisitions = 0; gender = G_MALE; birthday = new GregorianCalendar(3042, Calendar.JANUARY, 1); rank = 0; rankLevel = 0; status = S_ACTIVE; hits = 0; skills = new Hashtable<String, Skill>(); salary = -1; campaign = c; doctorId = null; unitId = null; oldDoctorId = -1; oldUnitId = -1; toughness = 0; biography = ""; nTasks = 0; personnelLog = new ArrayList<LogEntry>(); awards = new ArrayList<Award>(); idleMonths = -1; daysToWaitForHealing = 15; resetMinutesLeft(); prisonerStatus = PRISONER_NOT; dependent = false; commander = false; isClanTech = false; techUnitIds = new ArrayList<UUID>(); salary = -1; phenotype = PHENOTYPE_NONE; clan = Faction.getFaction(factionCode).isClan(); bloodname = ""; primaryDesignator = DESIG_NONE; secondaryDesignator = DESIG_NONE; <START> awardsFactory = AwardsFactory.getInstance(); <END> }</code><technical_language>note storing references a singleton class in instance of another class</technical_language>

Target:
public Person(String name, Campaign c, String factionCode) { this.name = name; callsign = ""; portraitCategory = Crew.ROOT_PORTRAIT; portraitFile = Crew.PORTRAIT_NONE; portraitCategoryOverride = null; portraitFileOverride = null; xp = 0; acquisitions = 0; gender = G_MALE; birthday = new GregorianCalendar(3042, Calendar.JANUARY, 1); rank = 0; rankLevel = 0; status = S_ACTIVE; hits = 0; skills = new Hashtable<String, Skill>(); salary = -1; campaign = c; doctorId = null; unitId = null; oldDoctorId = -1; oldUnitId = -1; toughness = 0; biography = ""; nTasks = 0; personnelLog = new ArrayList<LogEntry>(); awards = new ArrayList<Award>(); idleMonths = -1; daysToWaitForHealing = 15; resetMinutesLeft(); prisonerStatus = PRISONER_NOT; dependent = false; commander = false; isClanTech = false; techUnitIds = new ArrayList<UUID>(); salary = -1; phenotype = PHENOTYPE_NONE; clan = Faction.getFaction(factionCode).isClan(); bloodname = ""; primaryDesignator = DESIG_NONE; secondaryDesignator = DESIG_NONE; }
Source:
<code>private void addOrUpdateAddtionalClusterFeatures() { Set<SupportedAdditionalClusterFeature> supportedFeatures = clusterFeatureDao.getSupportedFeaturesByClusterId(getVdsGroup().getId()); supportedFeatures.removeAll(getVdsGroup().getAddtionalFeaturesSupported()); <START> if (!supportedFeatures.isEmpty()) { <END> for (SupportedAdditionalClusterFeature feature : supportedFeatures) { if (feature.isEnabled()) { feature.setEnabled(false); clusterFeatureDao.updateSupportedClusterFeature(feature); } } } Set<SupportedAdditionalClusterFeature> additionalClusterFeaturesAdded = getAdditionalClusterFeaturesAdded(); if (CollectionUtils.isNotEmpty(additionalClusterFeaturesAdded)) { clusterFeatureDao.addAllSupportedClusterFeature(additionalClusterFeaturesAdded); } }</code><technical_language>surrounding if is needed. if supportedFeatures, iteration executed for it</technical_language>

Target:
private void addOrUpdateAddtionalClusterFeatures() { Set<SupportedAdditionalClusterFeature> supportedFeatures = clusterFeatureDao.getSupportedFeaturesByClusterId(getVdsGroup().getId()); supportedFeatures.removeAll(getVdsGroup().getAddtionalFeaturesSupported()); for (SupportedAdditionalClusterFeature feature : supportedFeatures) { if (feature.isEnabled()) { feature.setEnabled(false); clusterFeatureDao.updateSupportedClusterFeature(feature); } } Set<SupportedAdditionalClusterFeature> additionalClusterFeaturesAdded = getAdditionalClusterFeaturesAdded(); if (CollectionUtils.isNotEmpty(additionalClusterFeaturesAdded)) { clusterFeatureDao.addAllSupportedClusterFeature(additionalClusterFeaturesAdded); } }
Source:
<code>public FormRecord process(FormRecord record) throws InvalidStructureException, IOException, XmlPullParserException, UnfullfilledRequirementsException { String form = record.getPath(c); final File f = new File(form); final Cipher decrypter = FormUploadUtil.getDecryptCipher((new SecretKeySpec(record.getAesKey(), "AES"))); InputStream is = new CipherInputStream(new FileInputStream(f), decrypter); AndroidTransactionParserFactory factory = new AndroidTransactionParserFactory(c, null) { @Override public TransactionParser getParser(KXmlParser parser) { String namespace = parser.getNamespace(); String name = parser.getName(); if (LedgerXmlParsers.STOCK_XML_NAMESPACE.equals(namespace) || "case".equalsIgnoreCase(name)) { return super.getParser(parser); } else { return null; } } }; XmlFormRecordProcessor.process(is, factory); Intent i = new Intent("org.commcare.dalvik.api.action.data.update"); <START> i.putStringArrayListExtra("cases", factory.getCreatedAndUpdatedCases()); <END> c.sendBroadcast(i); FormRecord updatedRecord = updateRecordStatus(record, FormRecord.STATUS_UNSENT); if(factory.wereCaseIndexesDisrupted()) { if(isBulkProcessing) { isPurgePending = true; } else { performPurge(); } } return updatedRecord; }</code><technical_language>is this ok broadcasting</technical_language>

Target:
public FormRecord process(FormRecord record) throws InvalidStructureException, IOException, XmlPullParserException, UnfullfilledRequirementsException { String form = record.getPath(c); final File f = new File(form); final Cipher decrypter = FormUploadUtil.getDecryptCipher((new SecretKeySpec(record.getAesKey(), "AES"))); InputStream is = new CipherInputStream(new FileInputStream(f), decrypter); AndroidTransactionParserFactory factory = new AndroidTransactionParserFactory(c, null) { @Override public TransactionParser getParser(KXmlParser parser) { String namespace = parser.getNamespace(); String name = parser.getName(); if (LedgerXmlParsers.STOCK_XML_NAMESPACE.equals(namespace) || "case".equalsIgnoreCase(name)) { return super.getParser(parser); } else { return null; } } }; XmlFormRecordProcessor.process(is, factory); Intent i = new Intent("org.commcare.dalvik.api.action.data.update"); i.putStringArrayListExtra("cases", factory.getCreatedAndUpdatedCases()); c.sendBroadcast(i, "org.commcare.dalvik.provider.cases.read"); FormRecord updatedRecord = updateRecordStatus(record, FormRecord.STATUS_UNSENT); if(factory.wereCaseIndexesDisrupted()) { if(isBulkProcessing) { isPurgePending = true; } else { performPurge(); } } return updatedRecord; }
Source:
<code>private void addWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) { if (widget.getName().equals("Role")) { addRoleWidget(sb, workItem, widget); } else if (widget.getName().equals("Review Defect")) { addDefectWidget(sb, workItem, widget); } else if (widget.getName().equals("Commit Manager")) { <START> addCommitManager(sb, workItem, widget); <END> } else { addWidgetDefault(sb, workItem, widget); } }</code><technical_language>Suggest making strings Role, Review Defect, Commit Manager constants</technical_language>

Target:
private void addWidget(StringBuilder sb, IAtsWorkItem workItem, IAtsWidgetDefinition widget) { if (widget.getName().equals(ROLE_WIDGET_NAME)) { addRoleWidget(sb, workItem, widget); } else if (widget.getName().equals(REVIEW_DEFECT_WIDGET_NAME)) { addDefectWidget(sb, workItem, widget); } else if (widget.getName().equals(COMMIT_MANAGER_WIDGET_NAME)) { addCommitManager(sb, workItem, widget); } else { addWidgetDefault(sb, workItem, widget); } }
Source:
<code>public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; <START> if (getClass() != obj.getClass()) <END> return false; Provider other = (Provider) obj; if (getId() == null) { if (other.getId() != null) return false; } else if (!getId().equals(other.getId())) return false; if (getUrl() == null) { if (other.getUrl() != null) return false; } else if (!getUrl().equals(other.getUrl())) return false; if (getDescription() == null) { if (other.getDescription() != null) return false; } else if (!getDescription().equals(other.getDescription())) return false; if (getName() == null) { if (other.getName() != null) return false; } else if (!getName().equals(other.getName())) return false; return true; }</code><technical_language>preferred 'instanceof' of class comparison, especially in a candidate inheritance/proxy/etc..</technical_language>

Target:
public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof Provider)) { return false; } Provider other = (Provider) obj; if (getDescription() == null) { if (other.getDescription() != null) { return false; } } else if (!getDescription().equals(other.getDescription())) { return false; } if (getId() == null) { if (other.getId() != null) { return false; } } else if (!getId().equals(other.getId())) { return false; } if (getName() == null) { if (other.getName() != null) { return false; } } else if (!getName().equals(other.getName())) { return false; } if (getType() != other.getType()) { return false; } if (getUrl() == null) { if (other.getUrl() != null) { return false; } } else if (!getUrl().equals(other.getUrl())) { return false; } return true; }
Source:
<code>protected final IField[] getExtractedFields(final ICompilationUnit unit) { Assert.isNotNull(unit); final List<IJavaElement> list= new ArrayList<>(); for (IMember <START> fMember : <END> fMembers) { if (fMember instanceof IField) { final IJavaElement element= JavaModelUtil.findInCompilationUnit(unit, fMember); if (element instanceof IField) list.add(element); } } final IField[] fields= new IField[list.size()]; list.toArray(fields); return fields; }</code><technical_language>rename member</technical_language>

Target:
protected final IField[] getExtractedFields(final ICompilationUnit unit) { Assert.isNotNull(unit); final List<IJavaElement> list= new ArrayList<>(); for (IMember member : fMembers) { if (member instanceof IField) { final IJavaElement element= JavaModelUtil.findInCompilationUnit(unit, member); if (element instanceof IField) list.add(element); } } final IField[] fields= new IField[list.size()]; list.toArray(fields); return fields; }
Source:
<code>public void testTimeout() throws Exception { final Mailer mailer = Mockito.mock(Mailer.class); Mockito.doAnswer(x -> { Thread.sleep(100000); return null; }).when(mailer).sendMail(Mockito.any()); final EmailSender sender = new EmailSender(mailer, _config, new ScheduledThreadPoolExecutor(1)); final CompletionStage<Void> send = sender.send( TestBeanFactory.createRecipient(), ImmutableMap.of(new HtmlReportFormat.Builder().build(), TestBeanFactory.createRenderedReportBuilder().build()), Duration.ofMillis(500) ); boolean cancelled = false; try { <START> send.toCompletableFuture().get(1, TimeUnit.SECONDS); <END> } catch (final CancellationException exception) { cancelled = true; } Assert.assertTrue("send().get() should have thrown a CancellationException", cancelled); }</code><technical_language>(Same feedback in HtmlScreenshotRendererIT) I prefer this a completely blocking .get() put timeout test</technical_language>

Target:
public void testTimeout() throws Exception { final Mailer mailer = Mockito.mock(Mailer.class); Mockito.doAnswer(x -> { Thread.sleep(100000); return null; }).when(mailer).sendMail(Mockito.any()); final EmailSender sender = new EmailSender(mailer, _config, new ScheduledThreadPoolExecutor(1)); final CompletionStage<Void> send = sender.send( TestBeanFactory.createRecipient(), ImmutableMap.of(new HtmlReportFormat.Builder().build(), TestBeanFactory.createRenderedReportBuilder().build()), Duration.ofMillis(500) ); boolean cancelled = false; try { send.toCompletableFuture().get(); } catch (final CancellationException exception) { cancelled = true; } Assert.assertTrue("send().get() should have thrown a CancellationException", cancelled); }
Source:
<code>void single( long reference, Read read ) { if ( getId() != NO_ID ) { reset(); } if ( pageCursor == null ) { pageCursor = read.nodePage( reference ); } this.next = reference; this.highMark = NO_ID; this.read = read; this.hasChanges = HasChanges.MAYBE; this.addedNodes = emptySet(); <START> this.single = true; <END> }</code><technical_language>I this.highMark == NO_ID check for single introducing a new field. is a method isSingle method instead</technical_language>

Target:
void single( long reference, Read read ) { if ( getId() != NO_ID ) { reset(); } if ( pageCursor == null ) { pageCursor = read.nodePage( reference ); } this.next = reference; this.highMark = NO_ID; this.read = read; this.hasChanges = HasChanges.MAYBE; this.addedNodes = emptySet(); }
Source:
<code>public SpecialAnonymizationUserPage fillFutureAnon(String anonymizedUser) { <START> jsActions.scrollBy(0, 400); <END> wait.forElementClickable(submitButton); AnonymizationTextBox.sendKeys(anonymizedUser); return this; }</code><technical_language>nice create integer constant assign 400 it, here. E.g. public static int WINDOW_HEIGHT = 400. more explicit for another person (no magic numbers)</technical_language>

Target:
public SpecialAnonymizationUserPage fillFutureAnon(String anonymizedUser) { wait.forElementClickable(submitButton); AnonymizationTextBox.sendKeys(anonymizedUser); return this; }
Source:
<code>private void uiStateScreenTransition() { Fragment fragment = null; FragmentTransaction ft = fm.beginTransaction(); switch (uiState){ case upgrade: case ready: if(incomingRef == null || incomingRef.length() == 0){ Log.e(TAG,"During install: IncomingRef is empty!"); Toast.makeText(getApplicationContext(), "Invalid URL: '" + incomingRef + "'", Toast.LENGTH_SHORT).show(); return; } fragment = startInstall; break; <START> default: <END> List<Fragment> fgmts = fm.getFragments(); int lastIndex = fgmts != null ? fgmts.size() - 1 : -1; if(lastIndex > -1) { fragment = fgmts.get(lastIndex); if (BuildConfig.DEBUG) { Log.v(TAG, "Last fragment: " + fragment); } } if(!(fragment instanceof SetupEnterURLFragment)){ fragment = installFragment; } else { } break; } ft.replace(R.id.setup_fragment_container, fragment); ft.commit(); }</code><technical_language>I re-instating url chooser fragment in default case, UiState.advanced is dedicated UiState for in url chooser fragment. set chooser is launched properly restore</technical_language>

Target:
private void uiStateScreenTransition() { Fragment fragment; FragmentTransaction ft = fm.beginTransaction(); switch (uiState){ case UPGRADE: case READY_TO_INSTALL: if(incomingRef == null || incomingRef.length() == 0){ Log.e(TAG,"During install: IncomingRef is empty!"); Toast.makeText(getApplicationContext(), "Invalid URL: '" + incomingRef + "'", Toast.LENGTH_SHORT).show(); return; } fragment = startInstall; break; case IN_URL_ENTRY: fragment = restoreInstallSetupFragment(); break; case CHOOSE_INSTALL_ENTRY_METHOD: fragment = installFragment; break; default: return; } ft.replace(R.id.setup_fragment_container, fragment); ft.commit(); }
Source:
<code>public SessionPresenterView showError(final String message) { Notify.hideAll(); getSettings().setType(kieNotificationCssClass(NotifyType.DANGER)); <START> showNotification(translate(SessionPresenterView_Error), <END> translate(SessionPresenterView_Notifications), IconType.EXCLAMATION_CIRCLE); return this; }</code><technical_language>This message argument unsued.... IMO is confusing, Alerts panel present (standalone/submarine)..</technical_language>

Target:
public SessionPresenterView showError(final String message) { getSettings().setType(kieNotificationCssClass(NotifyType.DANGER)); showNotification(translate(SessionPresenterView_Error), message, IconType.EXCLAMATION_CIRCLE); return this; }